home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / sword.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  6KB  |  237 lines

  1. /* sword.c 剣みたいに長い敵 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../shot.h"
  7. #include "../enemy.h"
  8. #include "../eshot.h"
  9. #include "../effect.h"
  10. #include "../psearch.h"
  11. #include "../sound.h"
  12.  
  13.  
  14. #define PALET_MAIN    0x0400
  15.  
  16. #define HP_0    90
  17.  
  18. enum {
  19.     APPEAR_LEFT = 0, APPEAR_RIGHT
  20. };
  21.  
  22. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  23.  
  24.  
  25. /* 関数プロトタイプ宣言 */
  26. static short EnemyMoveSword (ENEMY *);
  27. static void EnemyFreeSword (ENEMY *);
  28.  
  29.  
  30. /* 初期化ルーチン */
  31. void EnemyAllocSword (ENEMY * p)
  32. {
  33.     if (SHORT_LX < 144) {
  34.         p->m_work5 = APPEAR_LEFT;
  35.         p->vx = 32768;
  36.     } else {
  37.         p->m_work5 = APPEAR_RIGHT;
  38.         p->vx = -32768;
  39.     }
  40.     p->vy = 65536;
  41.  
  42.     p->pt = obj_sword;
  43.     p->info = PALET_MAIN | PRIORITY_BOSS;
  44.     p->hit_sx = 48;        /* 自機ショットに対する当たり判定 */
  45.     p->hit_sy = 16;
  46.     p->hp = HP_0;
  47.     p->damage = 0;
  48.     p->flash = 0;
  49.  
  50.     p->damage_mode = DAMAGE_PIERCE;
  51.     p->func_enemy_move = EnemyMoveSword;
  52.     p->func_enemy_free = EnemyFreeSword;
  53.  
  54.     /* コア関連 */
  55.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  56.     p->core_pt = sp_core;
  57.  
  58.     p->m_work = p->m_work2 = p->s_work = 0;
  59. }
  60.  
  61.  
  62.  
  63. /* 移動ルーチン */
  64. /* 返り値:非0なら消去 */
  65. static short EnemyMoveSword (ENEMY * p)
  66. {
  67.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  68.     p->x = (p->lx += p->vx) >> 16;
  69.     p->y = (p->ly += p->vy) >> 16;
  70.  
  71.     switch (p->m_work) {
  72.  
  73.     case 0:
  74.         if (p->m_work2++ > 150) {
  75.             if (p->m_work5 == APPEAR_LEFT) {
  76.                 if ((p->vx -= 2048) <= 0)
  77.                     p->m_work++;
  78.             } else {
  79.                 if ((p->vx += 2048) >= 0)
  80.                     p->m_work++;
  81.             }
  82.         }
  83.         /* 攻撃処理 */
  84. #define INTERVAL0_START    100
  85. #define INTERVAL0    65
  86. #define SPEED_SHOT0    10
  87.         switch (p->s_work++) {
  88.         case INTERVAL0_START + INTERVAL0 * 0:
  89.         case INTERVAL0_START + INTERVAL0 * 1:
  90.             EshotAlloc (ESHOT_NRG05, p->x, p->y + 16, SPEED_SHOT0, 64, 1);
  91.             EshotAlloc (ESHOT_NRG04, p->x - 6, p->y + 8, SPEED_SHOT0, 64, 1);
  92.             EshotAlloc (ESHOT_NRG04, p->x + 6, p->y + 8, SPEED_SHOT0, 64, 1);
  93.             EshotAlloc (ESHOT_NRG03, p->x - 12, p->y, SPEED_SHOT0, 64, 1);
  94.             EshotAlloc (ESHOT_NRG03, p->x + 12, p->y, SPEED_SHOT0, 64, 1);
  95.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  96.             break;
  97.         case INTERVAL0_START + INTERVAL0 * 2:
  98.             p->s_work = 0;
  99.             break;
  100.         default:
  101.             break;
  102.         }
  103.         break;
  104.  
  105.     case 1:
  106.         if (p->vy > -8192) {
  107.             p->vy -= 2048;
  108.         } else {
  109.             p->m_work++;
  110.         }
  111.         break;
  112.  
  113.         /* カバー開く */
  114.     case 2:
  115.         p->pt++;
  116.         if (p->pt >= obj_sword + 24) {    /* カバー開ききったら */
  117.             p->m_work++;
  118.             p->s_work = p->s_work2 = p->s_work3 = 0;
  119.             SoundSetSE (SE_LOCK_M);
  120.         }
  121.         break;
  122.  
  123.     case 3:
  124.         if (p->vy < 16384)
  125.             p->vy += 2048;
  126.  
  127.         /* 攻撃処理 */
  128.  
  129.         switch (p->s_work2++) {
  130. #define INTERVAL1_1    20
  131. #define SPEED_SHOT1_1    6
  132.         case INTERVAL1_1 * 1:
  133.             p->s_angle = psearch (p->x - 16, p->y - 8) - 4;        /* 自機の方向をサーチ */
  134.             p->s_angle2 = psearch (p->x + 16, p->y - 8) + 4;    /* 自機の方向をサーチ */
  135.             EshotAlloc (ESHOT_NRG24N, p->x - 16, p->y - 8, SPEED_SHOT1_1, p->s_angle, 0);
  136.             EshotAlloc (ESHOT_NRG24N, p->x + 16, p->y - 8, SPEED_SHOT1_1, p->s_angle2, 0);
  137.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  138.             break;
  139.         case INTERVAL1_1 * 2:
  140.         case INTERVAL1_1 * 3:
  141.         case INTERVAL1_1 * 4:
  142.             EshotAlloc (ESHOT_NRG14N, p->x - 16, p->y - 8, SPEED_SHOT1_1, p->s_angle + 4, 0);
  143.             EshotAlloc (ESHOT_NRG14N, p->x + 16, p->y - 8, SPEED_SHOT1_1, p->s_angle2, 0);
  144.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  145.             break;
  146.         case INTERVAL1_1 * 7:
  147.             p->s_work2 = 0;
  148.             break;
  149.         }
  150.  
  151.         /* 下向き矢印弾 */
  152. #define INTERVAL1_2    28
  153. #define SPEED_SHOT1_2    10
  154.         switch (p->s_work3++) {
  155.         case INTERVAL1_2 * 1:
  156.             if (wabs (SHORT_LX - player->x) < 64) {
  157.                 EshotAlloc (ESHOT_NRG05, p->x, p->y + 16, SPEED_SHOT0, 64, 1);
  158.                 EshotAlloc (ESHOT_NRG04, p->x - 6, p->y + 8, SPEED_SHOT0, 64, 1);
  159.                 EshotAlloc (ESHOT_NRG04, p->x + 6, p->y + 8, SPEED_SHOT0, 64, 1);
  160.                 EshotAlloc (ESHOT_NRG03, p->x - 12, p->y, SPEED_SHOT0, 64, 1);
  161.                 EshotAlloc (ESHOT_NRG03, p->x + 12, p->y, SPEED_SHOT0, 64, 1);
  162.                 SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  163.             }
  164.             break;
  165.         case INTERVAL1_2 * 6:
  166.             p->s_work3 = 0;
  167.             break;
  168.         }
  169.  
  170.         if (SHORT_LY > 192)
  171.             p->m_work++;
  172.         break;
  173.  
  174.         /* 撤退 */
  175.     case 4:
  176.         if (SHORT_VY < 1)
  177.             p->vy += 4096;
  178.         /* 画面外に出たら消去 */
  179.         if (SHORT_LY > 256 + 64 + 16)
  180.             return (-1);    /* 消去 */
  181.         break;
  182.     }
  183.  
  184.     /* もし前回ダメージを受けたなら */
  185.     if (p->damage) {
  186.         p->hp -= p->damage;
  187.         p->damage = 0;
  188.         SoundSetSE (SE_DAMAGE);        /* 敵ダメージ音 */
  189.  
  190.         /* 白(or赤)フラッシュ処理 */
  191.         if (p->info == (PALET_MAIN | PRIORITY_BOSS)) {
  192.             if (p->hp < HP_PALET_RED)
  193.                 p->info = PALET_RED | PRIORITY_BOSS;
  194.             else
  195.                 p->info = PALET_DAMAGE | PRIORITY_BOSS;
  196.         } else {
  197.             p->info = PALET_MAIN | PRIORITY_BOSS;
  198.         }
  199.  
  200.  
  201.         /* 耐久力が0以下なら消去 */
  202.         if (p->hp <= 0) {
  203.             EffectAlloc (EFFECT_EXPL, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  204.             EffectAlloc (EFFECT_POINTS, POINTS_3000, p->x, p->y);    /* 得点を出現させる */
  205.             SoundSetSE (SE_EXPL_M);        /* 中ボス爆発音 */
  206.             return (-1);
  207.         }
  208.     } else {
  209.         /* 耐久力が少なくなったら赤フラッシュ */
  210.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < HP_PALET_RED)) {
  211.             p->info = PALET_RED | PRIORITY_BOSS;
  212.             if (p->flash > TIMER_FLASH_NORMAL)
  213.                 p->flash = 0;
  214.         } else {
  215.             p->info = PALET_MAIN | PRIORITY_BOSS;
  216.         }
  217.     }
  218.     xobj_set_st (p);    /* 表示 */
  219.  
  220.     /* コアの表示 */
  221.     p->core_x = p->x - 8;
  222.     p->core_y = p->y - 8;
  223.     xsp_set_st (&(p->core_x));
  224.  
  225.     return (0);
  226. }
  227.  
  228.  
  229.  
  230. /* 消去ルーチン */
  231. static void EnemyFreeSword (ENEMY * p)
  232. {
  233.     /* 刺さったショットの処理 */
  234.     if ((p->shot) && (p->shot->enemy) && (p->shot->enemy == p))
  235.         p->shot->status = SHOT_STATUS_NON;
  236. }
  237.